package com.itheima.leetcode.od.b.string;

/**
 * (A卷,200分)- 机房布局（Java & JS & Python）
 * <p>
 * 题目描述
 * <p>
 * 小明正在规划一个大型数据中心机房，为了使得机柜上的机器都能正常满负荷工作，需要确保在每个机柜边上至少要有一个电箱。
 * 为了简化题目，假设这个机房是一整排，M表示机柜，I表示间隔，请你返回这整排机柜，至少需要多少个电箱。 如果无解请返回 -1 。
 * <p>
 * 输入描述
 * <p>
 * 无
 * <p>
 * 输出描述
 * <p>
 * 无
 * <p>
 * 用例
 * <p>
 * 输入	MIIM
 * 输出	2
 * 说明	无
 * 逻辑分析解法（最优解法）
 * <p>
 * 题目解析
 * <p>
 * 本题其实只要朝一个方向优先放电箱即可，但是通常我们习惯从左向右遍历，因此这里优先将电箱放在机柜的右边。
 * <p>
 * 为什么要将电箱优先放在右边呢？比如下面这个例子：
 * <p>
 * I M I M
 * <p>
 * 优先将机柜放在红色I位置，则最终只需要一个电箱。如果将机柜放绿色I位置，则最终需要两个电箱。
 * <p>
 * 再比如下面这个例子
 * <p>
 * M I M I
 * <p>
 * 由于我们是从左往右遍历，因此第一个机柜M，优先将电箱放在它的右边。
 * <p>
 * 但是，如果机柜的右侧放不了电箱呢？比如
 * <p>
 * I M M I
 * <p>
 * 此时，我们需要看机柜的左侧能不能放，如果能放，则放，不然对应机柜就没有配置电箱了。
 * <p>
 * 如果机柜的左右两侧都放不了电箱呢？
 * <p>
 * M M I
 * <p>
 * 此时应该直接返回-1。
 * <p>
 * 另外，还有一个重要的点就是：
 * <p>
 * 如果机柜的右侧可以放电箱，比如第 i 个位置是机柜，第 i + 1个位置是间隔，则我们可以将电箱放到第 i + 1个位置上，此时：第 i + 2 个位置是什么还需要关注吗？
 * <p>
 * 比如：
 * <p>
 * M I M I
 * <p>
 * 上面红色的M还需关注放不放电箱吗？答案是不需要，因为他必然有一个电箱了。
 * <p>
 * 此时我们可以直接跳到i+3位置重新开始上面的判断。
 */
public class ComputerRoomLayout {
    public static void main(String[] args) {
        /*Scanner sc = new Scanner(System.in);
        String str = sc.next();*/

        String str = "MIIM";
        System.out.println(getResult(str));
    }

    public static int getResult(String str) {
        int n = str.length();

        // ans记录用了几个电箱
        int ans = 0;

        for (int i = 0; i < n; i++) {
            // 如果当前是机柜
            if (str.charAt(i) == 'M') {
                // 则优先将电箱放到该机柜的右边，如果机柜右边有间隔I的话
                if (i + 1 < n && str.charAt(i + 1) == 'I') {
                    ans++;
                    // 如果放成功了，即当前第 i 个位置是机柜，第i+1个位置是 电箱，那么第i+2个位置无论是机柜还是间隔都无所谓，下次我们直接从第i+3位置开始判断
                    i += 2; // 这里 i += 2结合下轮for循环的i++，就是i += 3
                }
                // 如果当前第i位置的机柜右边无法放入电箱，则只能将电箱放到其左边第i-1位置，但是第i-1位置必须是间隔I
                else if (i - 1 >= 0 && str.charAt(i - 1) == 'I') {
                    ans++;
                }
                // 如果当前机柜左右都无法放入电箱，则返回-1
                else {
                    ans = -1;
                    break;
                }
            }
        }

        return ans;
    }
}